﻿using System;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// Métodos necesarios para asegurar que los datos estén protegidos
/// </summary>
public class SecurityTools
{

    /* SaltGenerator
     * Genera una serie String de 12 caracteres por medio de CryptoServiceProvider
     */
    public String SaltGenerator()
    {
        RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
        byte[] buff = new byte[8];
        rngCsp.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }

    /* HashPassword
     * Genera el hash del password con algoritmo SHA-2
     * param SaltedPass: El salt que se envía como parámetro
     */
    public String HashPassword(String SaltedPass)
    {
        using (HashAlgorithm hashAlg = new SHA256CryptoServiceProvider())
        {
            byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(SaltedPass);
            byte[] bytHash = hashAlg.ComputeHash(bytValue);
            String base64 = Convert.ToBase64String(bytHash);
            return base64;
        }

    }

    /* CompareHashPass
     * Compara si el password que se provee en el Login es igual al de la BD
     * param StoredHash: Es el password hash del usuario guardado en la BD
     * param StoredSalt: Es el salt utilizado para el password del usuario 
     *                   guardado en la BD
     * param ProvidedPass: Es el password que se obtiene del Login Control
     */ 
    public Boolean CompareHashPass(String StoredHash, String StoredSalt, String ProvidedPass)
    {
        return StoredHash.Equals(HashPassword(ProvidedPass + StoredSalt));
    }


    // Obtiene el String que fue codificado en Base64
    public String DecodeFrom64(String encodedData)
    {
        return ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(encodedData));
    }

    // Convierte el String a Base64
    public String EncodeTo64(String toEncode)
    {
        return Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(toEncode));
    }
}